/**************************************************************************************************
**                                                                                               **
**  文件名称:  dal_timer_drv.c                                                                   **
**  版权所有:  CopyRight @ Xiamen Yaxon NetWork CO.LTD. 2017                                     **
**  文件描述:  定时器驱动模块                                                                    **
**  ===========================================================================================  **
**  创建信息:  | 2017-7-27 | LEON | 创建本模块                                                   **
**  ===========================================================================================  **
**  修改信息:  单击此处添加....                                                                  **
**************************************************************************************************/
#include "dal_include.h"
#include "dal_timer_drv.h"

/*************************************************************************************************/
/*                           模块宏定义                                                          */
/*************************************************************************************************/
#define MAX_TIMER_REG        2                                                 /* 注册最大个数 */

/*************************************************************************************************/
/*                           定时器注册信息                                                      */
/*************************************************************************************************/
typedef struct {
    INT32U    ttime;                                                           /* 定时时间(ms) */
    INT32U    ltime;                                                           /* 剩余时间(ms) */
    void    (*handl)(void);                                                    /* 回调函数 */
} TIMER_REG_T;

/*************************************************************************************************/
/*                           模块静态变量定义                                                    */
/*************************************************************************************************/
static TIMER_REG_T s_timerreg[MAX_TIMER_REG];

/**************************************************************************************************
**  函数名称:  StartTimer2
**  功能描述:  启动定时器运行
**  输入参数:  time: 定时器间隔，单位: ms
**  输出参数:  无
**  返回参数:  无
**  特别说明:  定时时长 T = (TIM_Period + 1) * (TIM_Prescaler + 1) / TIMxCLK; 单位秒; 其中TIMxCLK = 48M
**************************************************************************************************/
static void StartTimer2(INT32U time)
{
    TIM_TimeBaseInitTypeDef  init;
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 
    
    init.TIM_Period          = 10 * time - 1;
    init.TIM_Prescaler       = 4800 - 1;
    init.TIM_ClockDivision   = 0;
    init.TIM_CounterMode     = TIM_CounterMode_Up;
    
    TIM_TimeBaseInit(TIM2, &init);
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    TIM_Cmd(TIM2, ENABLE);
}

/**************************************************************************************************
**  函数名称:  TIM2_IRQ_Handler
**  功能描述:  定时器中断处理函数
**  输入参数:  无
**  输出参数:  无
**  返回参数:  无
**************************************************************************************************/
void TIM2_IRQ_Handler(void)
{	
    INT8U i;
    
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {
        
        TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update);
        
        for (i = 0; i < MAX_TIMER_REG; i++) {
            
            if ((s_timerreg[i].ttime != 0) && (s_timerreg[i].handl != NULL)) {
                if (s_timerreg[i].ltime > 0) {
                    s_timerreg[i].ltime--;
                } else {
                    s_timerreg[i].ltime = s_timerreg[i].ttime;
                    s_timerreg[i].handl();
                }
            }
        }
    }
}

/**************************************************************************************************
**  函数名称:  DAL_Timer_Init
**  功能描述:  定时器初始化函数
**  输入参数:  无
**  输出参数:  无
**  返回参数:  无
**************************************************************************************************/
void DAL_Timer_Init(void)
{
    YX_MEMSET(s_timerreg, 0, sizeof(s_timerreg));
    
    BSP_ConfigIRQEnable(TIM2_IRQn, FALSE);
    BSP_InstallIRQHandler(TIM2_IRQn, (IRQ_SERVICE_FUNC)TIM2_IRQ_Handler);
    BSP_ConfigIRQPriority(TIM2_IRQn, IRQ_PRIOTITY_TIMER);
    BSP_ConfigIRQEnable(TIM2_IRQn, TRUE);
    
    StartTimer2(1);
}

/**************************************************************************************************
**  函数名称:  DAL_RegTimerCtrl
**  功能描述:  注册定时器处理函数
**  输入参数:  time: 定时时长，单位ms; handl: 回调函数
**  输出参数:  无
**  返回参数:  无
**************************************************************************************************/
BOOLEAN DAL_RegTimerCtrl(INT32U time, void (*handl)(void))
{
    INT8U i;
    
    for (i = 0; i < MAX_TIMER_REG; i++) {
        if ((s_timerreg[i].ttime == 0) && (s_timerreg[i].handl == NULL)) {
            s_timerreg[i].ttime = time;
            s_timerreg[i].ltime = time;
            s_timerreg[i].handl = handl;
            return TRUE;
        }
    }
    
    return FALSE;
}


